﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotas.Core;
using GestorDeFlotasDesktop.GD1C2012DataSetTableAdapters;

namespace GestorDeFlotasDesktop.AbmAuto
{
    public partial class DatosAuto : FormDatosBase
    {

        private Auto unAuto { get; set; }

        public DatosAuto(ModoAbm modoAbm)
            : base(modoAbm)
        {
            InitializeComponent();

            popularMarcas();
        }

        public DatosAuto(ModoAbm modoAbm, Auto Auto)
            : this(modoAbm)
        {
            this.unAuto = Auto;
        }


        private void DatosAuto_Load(object sender, EventArgs e)
        {
            if (this.modoAbm == ModoAbm.Alta)
            {
                this.unAuto = new Auto();
            }
            else if (this.modoAbm == ModoAbm.Modificacion)
            {
                PopularControles(this.unAuto);
            }
        }

        private void PopularControles(Auto Auto)
        {

            if (this.unAuto == null) this.unAuto = new Auto();
            textBox_modelo.Text = Convert.ToString(Auto.modelo);
            textBox_patente.Text = Convert.ToString(Auto.patente);
            textBox_rodado.Text = Convert.ToString(Auto.rodado);
            textBox_licencia.Text = Convert.ToString(Auto.licencia);
            comboBox_reloj.Text = unAuto.reloj.marca + " " + unAuto.reloj.numeroDeSerie;
            comboBox_marcas.Text = Convert.ToString(Auto.marca);
            check_es_activo.Checked = Auto.esActivo;
            text_box_cod_reloj.Text = Convert.ToString(unAuto.reloj.codigoReloj);
        }



        private void label1_Click(object sender, EventArgs e)
        {

        }
                
        private void PopularAuto()
        {
            
            ItemCombo optionSelected = (ItemCombo)this.comboBox_marcas.SelectedItem;
            if (optionSelected != null) unAuto.marcaCodigo = optionSelected.Codigo;

            unAuto.modelo = this.textBox_modelo.Text;
            unAuto.patente = this.textBox_patente.Text;
            unAuto.licencia = this.textBox_licencia.Text;
            unAuto.rodado = this.textBox_rodado.Text;
            if (unAuto.reloj == null) unAuto.reloj = new Reloj();
            RelojSeleccionable optionSelectedReloj = (RelojSeleccionable)this.comboBox_reloj.SelectedItem;
            if (optionSelectedReloj != null)
            {
                unAuto.reloj.codigoReloj = optionSelectedReloj.relojCodigo;
            }
            else 
            {
                unAuto.reloj.codigoReloj = Convert.ToInt32(text_box_cod_reloj.Text); 
            }

            unAuto.esActivo = this.check_es_activo.Checked;
            
        }

        private List<string> ChequearCamposObligatorios()
        {
            
            List<string> camposInvalidos = new List<string>();

            if (string.IsNullOrEmpty(this.comboBox_marcas.Text))
            {
                camposInvalidos.Add("Marca");
            }
            
            if (string.IsNullOrEmpty(this.textBox_modelo.Text))
            {
                camposInvalidos.Add("Modelo");
            }

            if (string.IsNullOrEmpty(this.textBox_patente.Text))
            {
                camposInvalidos.Add("Patente");
            }

            if (string.IsNullOrEmpty(this.textBox_licencia.Text))
            {
                camposInvalidos.Add("Licencia");
            }

            if (string.IsNullOrEmpty(this.textBox_rodado.Text))
            {
                camposInvalidos.Add("Rodado");
            }

            if (string.IsNullOrEmpty(this.comboBox_reloj.Text))
            {
                camposInvalidos.Add("Reloj");
            }
            
            return camposInvalidos;
        }

        private void popularMarcas()
        {
        
            GD1C2012DataSet.TL_Marcas_AutosDataTable marcasDTAuto = new GD1C2012DataSet.TL_Marcas_AutosDataTable();
//            GD1C2012DataSet.TL_Marcas_RelojesDataTable marcasDTReloj = new GD1C2012DataSet.TL_Marcas_RelojesDataTable();
            GD1C2012DataSet.DatosRelojesDataTable relojesDT = new GD1C2012DataSet.DatosRelojesDataTable();
            DatosRelojesTableAdapter relojes = new DatosRelojesTableAdapter();

            relojes.Fill(relojesDT);

            TL_Marcas_AutosTableAdapter marcasAuto = new TL_Marcas_AutosTableAdapter();
  //          TL_Marcas_RelojesTableAdapter marcasReloj = new TL_Marcas_RelojesTableAdapter();
            marcasAuto.Fill(marcasDTAuto);
  //          marcasReloj.Fill(marcasDTReloj);

            foreach (var item in relojesDT)
            {
                this.comboBox_reloj.Items.Add(new RelojSeleccionable(item.reloj_codigo, item.reloj_nro_serie,item.reloj_es_activo,item.marca_nombre));
            }

            foreach (var item in marcasDTAuto)
            {
                this.comboBox_marcas.Items.Add(new ItemCombo(item.marca_codigo, item.marca_nombre));

            }
        }

        private void boton_guardar_Click(object sender, EventArgs e)
        {
              List<string> camposInvalidos = ChequearCamposObligatorios();
            if (!(camposInvalidos.Count > 0))
            {
                PopularAuto();
                if (this.modoAbm == ModoAbm.Alta)
                {
                    try
                    {
                        if (hayAutoConPatenteLicenciaReloj(unAuto))
                        {
                            MessageBox.Show(string.Format("Solo puede haber mas de un auto con la misma patente, licencia y reloj."));
                            return;
                        }

                        if (seEncuentraAsignadoElReloj(unAuto.reloj.codigoReloj)) {
                            MessageBox.Show(string.Format("Solo puede haber mas de un auto con la misma patente, licencia y reloj."));
                            return;
                        }
                        unAuto.Crear();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }
                }
                else if (this.modoAbm == ModoAbm.Modificacion)
                {
                    if (generaModificacionAutoMellizo(unAuto)) {
                        MessageBox.Show(string.Format("Solo puede haber mas de un auto con la misma patente, licencia y reloj."));
                        return;
                    }

                    if (seEncuentraAsignadoElReloj(unAuto.reloj.codigoReloj))
                    {
                        MessageBox.Show(string.Format("Solo puede haber mas de un auto con la misma patente, licencia y reloj."));
                        return;
                    }
                    unAuto.Modificar();
                }

                this.DialogResult = DialogResult.OK;
            }
            else
            {
                MostrarMensajeCamposObligatorios(camposInvalidos);
            }

        }

        public bool generaModificacionAutoMellizo(Auto unAuto) {
            TL_AutosTableAdapter tablaAuto = new TL_AutosTableAdapter();

            return ((int)tablaAuto.ScalarQueryVerificarQueNoExistenTaxisMellizos(unAuto.patente, unAuto.licencia, unAuto.relojCodigo, unAuto.codigoAuto)<=1);
            
        }

        public bool hayAutoConPatenteLicenciaReloj(Auto unAuto)
        {
            TL_AutosTableAdapter tablaAuto = new TL_AutosTableAdapter();

            return ((int)tablaAuto.ScalarQueryHayAutoConPatenteLicenciaReloj(unAuto.patente, unAuto.licencia, unAuto.reloj.codigoReloj) == 1);

        }

        public bool seEncuentraAsignadoElReloj(int codigoReloj) {
            TL_AutosTableAdapter tablaAuto = new TL_AutosTableAdapter();
            return ((int)tablaAuto.ScalarQuerySeEncuentraAsignadoElReloj(codigoReloj)==1);
        }

        }

        }  

